//Interfaz es la clase que tendra interaccion con los usuarios del juego
package Interfaz;

import java.util.*;
import perfeccion.*;

/**
 *
 * @author Daniel
 */
public class Interfaz {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic 
        int menuPrincipal = 0, edad, tamanoTablero, tamanoPanel, cantFichas;
        boolean controlJug, priJugAbandona, segJugAbandona;
        String nombre, alias;

        Juego unJuego = new Juego();
        Jugador priJugador = new Jugador("Gaston", "gas", 36, 0, 0);
        Jugador segJugador = new Jugador("Daniel", "Dani", 36, 0, 0);
        Jugador auxJugador = new Jugador();
        Ficha priJugFicha = new Ficha("B");
        Ficha segJugFicha = new Ficha("N");
        Ficha auxFicha = new Ficha("*");
        Scanner in = new Scanner(System.in);

        //		Comienzo del menu principal del programa
        //		El programa terminara cuando el operador ingrese la opcion 5
        while (menuPrincipal != 4) {
            System.out.println("---------------------------------------------------------------------------");
            System.out.println("---------------------------------------------------------------------------");
            System.out.println("MENU PRINCIPAL - Eliga una opcion:");
            System.out.println("\n1)- Ingresar jugador");
            System.out.println("\n2)- Jugar a Perfeccion");
            System.out.println("\n3)- Consulta de jugadores");
            System.out.println("\n4)- Finalizar el juego");
            System.out.println("---------------------------------------------------------------------------");
            System.out.println("---------------------------------------------------------------------------");
            System.out.print("\nIngrese la opcion deseada: ");
            //Validamos el ingreso realizado en el menu principal
            menuPrincipal = Utilidad.validarDato(4, 1, "Alerta - El valor ingresado no corresponde al MENU PRINCIPAL, intentelo nuevamente:");
            System.out.println();
            //Estructura de control para comenzar a despelagar el submenu correspondiente de acuerdo al ingreso ya hecho
            switch (menuPrincipal) {

                case 1: {
                    System.out.println("Usted a seleccionado la opcion 1, Ingresar un nuevo jugador.");
                    System.out.println("A continuacion, por favor ingrese los datos requeridos para su correcto ingreso.");
                    System.out.println();
                    System.out.println();

                    System.out.print("Ingrese el nombre del jugador:");
                    nombre = in.next();
                    System.out.println();

                    System.out.print("Ingrese el alias a utilizar:");
                    alias = validarAlias(unJuego.listaJugadores);
                    System.out.println();

                    System.out.print("Ingrese la edad:");
                    //Valido la edad entre un  rango valido (maxEdad y minEdad, ver en la clase Utilidad)
                    edad = Utilidad.validarDato(100, 5, "ALERTA - El juego es apto para jugadores entre 5 y 100 años, ingrese la edad correctamente:");

                    System.out.println();
                    unJuego.agregarJugador(nombre, alias, edad, 0, 0);
                    System.out.println("INFO - Proceso exitoso, el usuario " + alias + " a sido cargado al sistema.");
                    System.out.println("");

                    break;
                }//Fin del case 1, "Ingresar un nuevo jugador"

                case 2: {
                    unJuego.listaJugadores.add(priJugador);
                    unJuego.listaJugadores.add(segJugador);
                    if (unJuego.listaJugadores.size() > 1) {
                        System.out.println();
                        System.out.println("Bienvenido a JUGAR PERFECCION");
                        System.out.println();
                        System.out.println("Eliga un jugador de la lista de jugadores disponibles:");
                        priJugador = eligoJugador(unJuego.listaJugadores, "");
                        System.out.println();
                        System.out.println("---------------------------------------------------------------------------");
                        System.out.println("---------------------------------------------------------------------------");
                        System.out.println();
                        System.out.println("Eliga el contrincante del jugador ya eleguido:");
                        System.out.println();
                        controlJug = false;
                        while (!controlJug) {
                            segJugador = eligoJugador(unJuego.listaJugadores, " ");
                            if (priJugador.equals(segJugador)) {
                                System.out.println("");
                                System.out.println("ALERTA - Debe elegir un contrincante distinto.");
                                System.out.println("ALERTA - El contrincante eleguido coincide con el primer jugador elegido");
                                System.out.println("ALERTA - Eliga nuevamente...");
                            } else {
                                controlJug = true;
                            }
                            System.out.println();
                        }
                        System.out.println("INFO - Al primer jugador seleccionado le sera asignada la ficha BLANCA");
                        System.out.println("");
                        System.out.println("INFO - Al segundo jugador seleccionado le sera asignada la ficha NEGRA");
                        System.out.println();
                        System.out.print("Ingrese la dimension del tablero donde se jugara(Opciones 4, 6 u 8): ");

                        //Se valida el tamano del tablero de juego
                        tamanoTablero = Utilidad.validarTamanoTablero();
                        System.out.println();

                        //Se valida el tamano del panel de la partida
                        tamanoPanel = Utilidad.validarTamanoPanel(tamanoTablero);
                        System.out.println();

                        //Se validan la cantidad de fichas en juego
                        cantFichas = Utilidad.validarCantFichas(tamanoTablero, tamanoPanel);

                        priJugAbandona = false;
                        segJugAbandona = false;
                        System.out.println();
                        unJuego.creoJuego(unJuego.getPartidaActual(), priJugador, priJugFicha, segJugador, segJugFicha, tamanoTablero, tamanoPanel, cantFichas);
                        unJuego.setJugadorPartida(priJugador);
                        priJugador.setCantidadFichas(cantFichas);
                        unJuego.setJugadorPartida(segJugador);
                        segJugador.setCantidadFichas(cantFichas);
                        unJuego.setFichaPartida(priJugFicha);
                        unJuego.setFichaPartida(segJugFicha);
                        System.out.println("Se ha inicializado la partida de perfeccion.");
                        System.out.println();
                        //controlJuego es utilizada para terminar el juego por motivos de finalizacion sin abandono
                        while (((priJugador.getCantidadFichas() + segJugador.getCantidadFichas()) > 0) && (!priJugAbandona) && (!segJugAbandona)) {
                            // Juega el primer jugador y controlo si quiere abandonar la partida
                            priJugAbandona = turno(unJuego, priJugador, priJugFicha);
                            //Controlo que el abandono de la partida del primer jugador para hacer la jugada del segundo
                            if (!priJugAbandona && ((priJugador.getCantidadFichas() + segJugador.getCantidadFichas()) > 0)) {
                                //Juega el segundo jugador y controlo si quiere abandonar la partida
                                segJugAbandona = turno(unJuego, segJugador, segJugFicha);
                            } else {
                                segJugAbandona = true;
                            }
                            if (segJugAbandona) {
                                priJugAbandona = true;
                            }
                        }
                        //VER CUANDO SALE DEL WHILE QUIEN GANO LA PARTIDA Y ASIGNAR LOS PUNTOS
                    } else {
                        System.out.println();
                        System.out.println("ALERTA - Deben existir al menos 2 jugadores para realizar la partida.");
                        System.out.println();
                        System.out.println("ALERTA - Solo existe un jugador habilitado en el juego.");
                        System.out.println();
                        System.out.println("ALERTA - Por favor, ingrese la cantidad de jugadores necesaria y vuelva a intentarlo.");
                        System.out.println();
                    }

                    break;
                }//	Fin del case 2, "Jugar perfeccion"

                case 3: {
                    if (unJuego.listaJugadores.isEmpty()) {
                        System.out.println("\nALERTA - No se han ingresado Jugadores");
                        System.out.println();
                        break;
                    }
                    auxJugador = eligoJugador(unJuego.listaJugadores, "INFO - Eliga de la lista de jugadores para ver la puntuacion: ");
                    System.out.println("INFO - Los datos del jugador elegido son: ");
                    System.out.println(auxJugador.toString());

                    break;
                }//	Fin del case 3,  "Obtener puntuaciones actuales de los jugadores"

                case 4: {

                    break;
                }//	Fin del case 4, "Finalizar el juego"

            }//	Fin de el swich que maneja el  menu principal

        }//	Fin del while principal del programa

    }//	Fin del cuerpo principal del programa

    //Metodo utilizado para seleccionar los jugadores de la partida de la lista de ingresados.
    public static Jugador eligoJugador(ArrayList ListaJugadores, String mensaje) {
        //inicializo posicion con -1 como bandera para saber que no se eligio ningun jugador de la lista de jugadores
        int posicion = -1, i = 0, eligio;
        Jugador unJugador = new Jugador();

        if (!ListaJugadores.isEmpty()) {
            //	Deremos a elegir el jugador a desplegar los datos
            System.out.println(mensaje);
            //	Controlo que me elija un jugador, mientras tanto no salgo
            while (posicion == -1) {
                //	Imprimo los jugadores que hay ingresados
                for (i = 0; i < ListaJugadores.size(); i++) {
                    System.out.println();
                    unJugador = (Jugador) ListaJugadores.get(i);
                    System.out.println(unJugador.getAlias());
                    System.out.println();
                    System.out.print("Digite de acuerdo a su eleccion(1-SI / 2-NO): ");
                    eligio = Utilidad.validarDato(2, 1, "ALERTA - Las opciones a elegir son (1-SI / 2-NO): ");
                    if (eligio == 1) {
                        posicion = i;
                        return unJugador;
                    } else {
                        if ((i + 1) == ListaJugadores.size()) {
                            System.out.println("\nALERTA - No hay mas jugadores disponibles");
                            System.out.println("ALERTA - Debe elegir uno de la lista, intentelo nuevamente:");
                        }
                    }

                }
            }
        }
        return unJugador;
    }

    //Metodo utilizado para validar el Alias ingresado en la seccion "Agregar un jugador"
    public static String validarAlias(ArrayList ListaJugadores) {
        boolean ok = false;
        boolean yaExiste = false;
        Jugador jugUno = new Jugador();
        Jugador jugDos = new Jugador();
        String unAlias = "";

        Scanner in = new Scanner(System.in);
        while (!ok) {
            unAlias = in.nextLine();
            for (int i = 0; i < ListaJugadores.size(); i++) {
                jugUno = new Jugador(" ", unAlias, 0, 0, 0);
                jugDos = (Jugador) ListaJugadores.get(i);
                if (jugDos.equals(jugUno) && !yaExiste) {
                    yaExiste = true;
                    i = ListaJugadores.size();
                }
            }
            if (yaExiste) {
                yaExiste = false;
                System.out.println("ALERTA - El alias elegido ya existe y esta asignado a otro jugador.");
                System.out.println();
                System.out.println("ALERTA - El alias debe ser unico para cada jugador.");
                System.out.println();
                System.out.print("Por favor, ingrese un nuevo alias:");
            } else {
                ok = true;
            }
        }

        return unAlias;
    }

    public static boolean turno(Juego unJuego, Jugador unJugador, Ficha unaFicha) {
        
        int fila = 0, columna = 0;
        boolean finTurno = false, controlMovimiento;
        String jugada, priLug, segLug, terLug;
        
        Scanner in = new Scanner(System.in);

        System.out.println("El estado del tablero es: ");
        System.out.println();
        System.out.println(unJuego.getPartidaActual().getTablero().toString(unJuego.getPartidaActual().panelIn, unJuego.getPartidaActual().panel.getTablero(), unJuego.partidaActual.filPan, unJuego.getPartidaActual().colPan));
        System.out.println();
        if(!unJuego.getPartidaActual().panelIn){
            System.out.println("El estado del panel es:");
            System.out.println();
            System.out.println(unJuego.getPartidaActual().getPanel().toString(false,unJuego.getPartidaActual().panel.getTablero(),0,0));
        }

        System.out.println();
        System.out.println("Es su turno: " + unJugador.getAlias());
        System.out.println();
        System.out.println("INFO - Tiene disponibles para jugar " + unJugador.getCantidadFichas() + " fichas.");
        System.out.println("INFO - Si no tiene fichas disponibles, puede mover el panel.");
        System.out.println();

        controlMovimiento = false;
        while (!controlMovimiento) {
            System.out.println("");
            System.out.println("INFO - Debe ingresar la jugada con el siguiente formato.");
            System.out.println("INFO - J para colocar ficha, P para colocar el panel, M para mover el panel, X para abandonar.");
            System.out.println("INFO - Ejemplos: JA4 colocamos una ficha, PB1 colocamos el panel, MI1 mover el panel a la izquierda 1 lugar");
            System.out.println("");
            System.out.print("Ingrese la jugada a realizar(Tipo/Fila/Columna):");
            try {
                jugada = in.next();
                
                priLug = Utilidad.devuelvoPrimerLugar(jugada);
                if (priLug.equalsIgnoreCase("J") || priLug.equalsIgnoreCase("P")) {
                    fila = Utilidad.deStringAnumero(Utilidad.devuelvoSegundoLugar(jugada));
                    columna = Integer.parseInt(Utilidad.devuelvoTercerLugar(jugada));
                    if (priLug.equalsIgnoreCase("J")) {
                        //DESARROLLAR LA JUGADA Y SIMETRIAS
                    } else {
                        //DESARROLLAR COLOCAR PANEL Y SIMETRIA
                    }
                } else {
                    if (priLug.equalsIgnoreCase("M")) {
                        segLug = Utilidad.devuelvoSegundoLugar(jugada);
                        switch (segLug) {
                            case "A": {

                            }
                            case "B": {

                            }
                            case "D": {

                            }
                            case "I": {

                            }
                        }
                    } else {
                        if (priLug.equalsIgnoreCase("X")) {
                            System.out.println();
                            System.out.println("El jugador: " + unJugador.getAlias() + " a decidido abandonar la partida.");
                            System.out.println("Por tanto, pierde la partida actual...");
                            System.out.println();
                            finTurno = true;
                            controlMovimiento = true;
                            
                        } else {
                            System.out.println("");
                            System.out.println("ALERTA - El formato de la jugada es incorrecto.");
                            System.out.println("");
                        }

                    }
                }
            } catch (InputMismatchException e) {
                System.out.println();
                System.out.print("ALERTA - El dato ingresado no es del formato esperado.");
                System.out.print("ALERTA - El dato ingresado no es correcto.");
                System.out.println();
                System.out.print("Ingrese la jugada a realizar(Tipo/Fila/Columna):");
                in.next();
            }
        }

        return finTurno;
    }

}
